package to.pm.catalogo.ejb;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.annotation.PostConstruct;

import java.util.List;

import java.util.logging.Logger;

import javax.persistence.Query;
import to.pm.catalogo.bi.GestioneCatalogoBusiness;

import to.pm.catalogo.core.GestioneCategorie;
import to.pm.catalogo.core.GestioneProdotti;
import to.pm.catalogo.core.RicercaProdotto;

import to.pm.entity.catalogo.Categoria;
import to.pm.entity.catalogo.CategoriaConsumabili;
import to.pm.entity.catalogo.CategoriaInventariabili;
import to.pm.entity.catalogo.Prodotto;
import to.pm.entity.catalogo.ProdottoConsumabile;
import to.pm.entity.catalogo.ProdottoInventariabile;


@Stateless //(name=EjbName.CatalogoBean, mappedName=EjbName.CatalogoBean)
public class CatalogoBean
        implements GestioneCatalogoBusiness {

    EntityManager em;

    Logger log = Logger.getLogger(CatalogoBean.class.getName());

    //se le classi helper (in core) dovessero essere "statefull"
    //bisogna cambiare l'inizializzazione cosi' da creare
    //delle nuove classi ad ogni invocazione del slsb
    private RicercaProdotto   ricerca = new RicercaProdotto();
    private GestioneCategorie gestioneCategorie = new GestioneCategorie();
    private GestioneProdotti gestioneProdotti = new GestioneProdotti();

    

    @PostConstruct
    private void pc(){}

    @PersistenceContext
    private void setEm(EntityManager em){
        this.em = em;
        ricerca.setEm(em);
        gestioneCategorie.setEm(em);
        gestioneProdotti.setEm(em);
    }


    public List<? extends Prodotto> findProdottiByDescrizione(String descrizione) {
      return ricerca.findByDescrizione(descrizione);
    }

    public Prodotto findProdottoById(long id) {
        return ricerca.findById(id);
    }

/*
    public List<Categoria> findProdottiByCategoria(String desc) {
        return em.createQuery("select object(o) from Categoria as o where o.descrizione = \""+desc+"\"").getResultList();
    }
 */


    public  List<? extends Prodotto> findProdottiByCategoria(Categoria cat) {
        if (cat.isConsumabile()) {
            return findProdottiByCategoriaConsumabili((CategoriaConsumabili) cat);
        } else {
            return findProdottiByCategoriaInventariabili((CategoriaInventariabili) cat);
        }
    }

    private List<ProdottoConsumabile> findProdottiByCategoriaConsumabili(CategoriaConsumabili cat) {
        Query qc = em.createQuery("select object(pc) " +
                " from ProdottoConsumabile as pc " +
                " where pc.categoriaConsumabili = :cat");
        qc.setParameter("cat", cat);
        return  qc.getResultList();
    }

    private List<ProdottoInventariabile> findProdottiByCategoriaInventariabili(CategoriaInventariabili cat) {
        Query qi = em.createQuery("select object(pi) " +
                " from ProdottoInventariabile as pi " +
                " where pi.categoriaInventariabili = :cat");
        qi.setParameter("cat", cat);
        return qi.getResultList();
    }

    
    public Categoria createCategoria(Categoria categoria) {
        em.persist(categoria);
        log.info("createCategoria("+ categoria +")");
        return categoria;
    }

    public Prodotto createProdotto(Prodotto prodotto) {
        gestioneProdotti.addProdotto(prodotto);
        log.info("createProdotto("+ prodotto +")");
        return prodotto;
    }

}
